#ifndef _WX_STATUSBR_H_BASE_
#define _WX_STATUSBR_H_BASE_

#include "wx/defs.h"

#if wxUSE_STATUSBAR

#include "wx/window.h"
#include "wx/list.h"
#include "wx/dynarray.h"

extern const wxChar wxStatusBarNameStr[];

WX_DECLARE_LIST( wxString, wxListString );

#define wxSB_NORMAL    0x0000
#define wxSB_FLAT      0x0001
#define wxSB_RAISED    0x0002

class wxStatusBarBase : public wxWindow {
  public:
    wxStatusBarBase();

    virtual ~wxStatusBarBase();

    // field count
    // -----------

    // set the number of fields and call SetStatusWidths(widths) if widths are
    // given
    virtual void SetFieldsCount( int number = 1, const int *widths = NULL );
    int GetFieldsCount() const { return m_nFields; }

    // field text
    // ----------

    virtual void SetStatusText( const wxString& text, int number = 0 ) = 0;
    virtual wxString GetStatusText( int number = 0 ) const = 0;

    void PushStatusText( const wxString& text, int number = 0 );
    void PopStatusText( int number = 0 );
    virtual void SetStatusWidths( int n, const int widths[] );
    virtual void SetStatusStyles( int n, const int styles[] );
    virtual bool GetFieldRect( int i, wxRect& rect ) const = 0;
    virtual void SetMinHeight( int height ) = 0;
    virtual int GetBorderX() const = 0;
    virtual int GetBorderY() const = 0;
    virtual bool AcceptsFocus() const { return false; }

  protected:
    // set the widths array to NULL
    void InitWidths();

    // free the status widths arrays
    void FreeWidths();

    // reset the widths
    void ReinitWidths() { FreeWidths(); InitWidths(); }

    // same, for field styles
    void InitStyles();
    void FreeStyles();
    void ReinitStyles() { FreeStyles(); InitStyles(); }

    // same, for text stacks
    void InitStacks();
    void FreeStacks();
    void ReinitStacks() { FreeStacks(); InitStacks(); }

    // calculate the real field widths for the given total available size
    wxArrayInt CalculateAbsWidths( wxCoord widthTotal ) const;

    // use these functions to access the stacks of field strings
    wxListString *GetStatusStack( int i ) const;
    wxListString *GetOrCreateStatusStack( int i );

    // the current number of fields
    int        m_nFields;

    // the widths of the fields in pixels if !NULL, all fields have the same
    // width otherwise
    int       *m_statusWidths;

    // the styles of the fields
    int       *m_statusStyles;

    // stacks of previous values for PushStatusText/PopStatusText
    // this is created on demand, use GetStatusStack/GetOrCreateStatusStack
    wxListString **m_statusTextStacks;

    DECLARE_NO_COPY_CLASS( wxStatusBarBase )
};

#if defined(__WXUNIVERSAL__)
#define wxStatusBarUniv wxStatusBar

#include "wx/univ/statusbr.h"
#elif defined(__WXPALMOS__)
#define wxStatusBarPalm wxStatusBar

#include "wx/palmos/statusbr.h"
#elif defined(__WIN32__) && wxUSE_NATIVE_STATUSBAR
#define wxStatusBar95 wxStatusBar

#include "wx/msw/statbr95.h"
#elif defined(__WXMAC__)
#define wxStatusBarMac wxStatusBar

#include "wx/generic/statusbr.h"
#include "wx/mac/statusbr.h"
#else
#define wxStatusBarGeneric wxStatusBar

#include "wx/generic/statusbr.h"
#endif

#endif // wxUSE_STATUSBAR

#endif
// _WX_STATUSBR_H_BASE_
